package org.wojtas.ustawienia;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

import org.wojtas.model.Uzytkownik;

import com.vaadin.server.VaadinService;

public class Ustawienia {
	private static Ustawienia instancja;
	private static Logger loger = Logger.getLogger("sklep");

	private String bazaDanychNazwa; //= "sklep";
	private String bazaDanychAdres; //= "localhost:5433";
	private String bazaDanychLogin; //= "postgres";
	private String bazaDanychHaslo; //= "postgres";
	private Uzytkownik zalogowanyUzytkownik;

	{
		inicjalizujLoger();
	}

	private Ustawienia() {
	}

	public static Logger getLogger() {
		return loger;
	}

	public static synchronized Ustawienia pobierzInstancje() {
		if (instancja != null) {
			return instancja;
		}
		instancja = new Ustawienia();
		zaladujUstawieniaZPliku();
		return instancja;
	}

	private void inicjalizujLoger() {
		try {
			String sciezka = VaadinService.getCurrent().getBaseDirectory().getAbsolutePath();
			
			FileHandler fh = new FileHandler(sciezka + "/logs.txt");
			fh.setFormatter(new SimpleFormatter());
			loger.addHandler(fh);
		} catch (Exception e) {
			log(e);
		}
	}

	public static void log(Throwable exception) {
		getLogger().log(Level.SEVERE, exception.getMessage(), exception);
	}
	
	public static void log(String message) {
		getLogger().info(message);
	}

	public String getBazaDanychNazwa() {
		return bazaDanychNazwa;
	}

	public void setBazaDanychNazwa(String bazaDanychNazwa) {
		this.bazaDanychNazwa = bazaDanychNazwa;
	}

	public String getBazaDanychAdres() {
		return bazaDanychAdres;
	}

	public void setBazaDanychAdres(String bazaDanychAdres) {
		this.bazaDanychAdres = bazaDanychAdres;
	}

	public String getBazaDanychLogin() {
		return bazaDanychLogin;
	}

	public void setBazaDanychLogin(String bazaDanychLogin) {
		this.bazaDanychLogin = bazaDanychLogin;
	}

	public String getBazaDanychHaslo() {
		return bazaDanychHaslo;
	}

	public void setBazaDanychHaslo(String bazaDanychHaslo) {
		this.bazaDanychHaslo = bazaDanychHaslo;
	}

	public Uzytkownik getZalogowanyUzytkownik() {
		return zalogowanyUzytkownik;
	}

	public void setZalogowanyUzytkownik(Uzytkownik zalogowanyUzytkownik) {
		this.zalogowanyUzytkownik = zalogowanyUzytkownik;
	}
	
	public boolean czyZalogowanyUzytkownik() {
		return zalogowanyUzytkownik != null;
	}

	private static void zaladujUstawieniaZPliku() {
		Properties prop = new Properties();
		try {
			String sciezka = VaadinService.getCurrent().getBaseDirectory().getAbsolutePath();
			
			File f = new File(sciezka + "/WEB-INF/lib/ustawienia.txt");
			if (!f.exists()) {
				throw new FileNotFoundException();
			}
			prop.load(new FileReader(f));
			instancja.setBazaDanychNazwa(prop.getProperty("bazaDanychNazwa"));
			instancja.setBazaDanychAdres(prop.getProperty("bazaDanychAdres"));
			instancja.setBazaDanychLogin(prop.getProperty("bazaDanychLogin"));
			instancja.setBazaDanychHaslo(prop.getProperty("bazaDanychHaslo"));
		} catch (NumberFormatException e) {
			log(e);
		} catch (FileNotFoundException e) {
			System.out.println("NIE ZNALEZIONO PLIKU!!");
			log(e);
		} catch (IOException e) {
			log(e);
		}
	}

	@SuppressWarnings("unused")
	private static void saveSetsToFile() {
		Properties prop = new Properties();
		prop.setProperty("bazaDanychAdres", instancja.getBazaDanychAdres());
		prop.setProperty("bazaDanychLogin", instancja.getBazaDanychLogin());
		prop.setProperty("bazaDanychHaslo", instancja.getBazaDanychHaslo());
		prop.setProperty("bazaDanychNazwa", instancja.getBazaDanychNazwa());
		try {
			String sciezka = VaadinService.getCurrent().getBaseDirectory().getAbsolutePath();
			prop.store(new FileWriter(new File(sciezka + "/WEB-INF/lib/ustawienia.txt")), null);
		} catch (IOException e) {
			log(e);
		}
	}

}
